package frame.laxcen.request;

import frame.laxcen.util.FrameUtil;
import frame.laxcen.util.FrameWriter;
import util.ByteArrayUtil;
import util.ByteUtil;

public class Request_0010_11 implements IRequest {

    public final byte[] FrameBytes;

    public Request_0010_11(byte[] tid, byte[] content) {

        this.FrameBytes = FrameWriter.instance((byte) 0b0010, (byte) 0x11)
                                     .writeU8((byte) 0b1111)
                                     .writeU8((byte) 0x03)
                                     .writeU16((short) 0x00)
                                     .writeU8s(content)
                                     .writeP8s((byte) 0x01, ByteArrayUtil.concat(new byte[] { (byte) 0x02, (byte) 0x0, (byte) 0x0, (byte) (tid.length * 8) }, tid))
                                     .toByteArray();

        FrameUtil.printFrame(FrameBytes);
    }

    public Request_0010_11(RequestTemplate_0010_11 template) {

        FrameWriter w = FrameWriter.instance((byte) 0b0010, (byte) 0x11);

        w.writeU8(template.AntennaFlag);

        w.writeU8(template.Area);

        w.writeU16(ByteUtil.bytePairToShort(template.Address_H, template.Address_L));

        w.writeU8s(template.Content);

        if(template.hasParam_0x01()) {

            w.writeP8s((byte) 0x01, ByteArrayUtil.concat(new byte[] {

                    template.Pid_0x01_0, template.Pid_0x01_1, template.Pid_0x01_2, template.Pid_0x01_3

            }, template.Pid_0x01_4_to_n));
        }

        if(template.hasParam_0x02()) {

            w.writeP32((byte) 0x02, template.Pid_0x02_0);

            w.writeU32(template.Pid_0x02_1);

            w.writeU32(template.Pid_0x02_2);

            w.writeU32(template.Pid_0x02_3);
        }

        if(template.hasParam_0x03()) {

            w.writeP8((byte) 0x03, template.Pid_0x03_0);
        }

        this.FrameBytes = w.toByteArray();
    }

    @Override
    public byte[] getFrameBytes() {

        return FrameBytes;
    }

    public static class RequestTemplate_0010_11 {

        // 天线端口

        // bit位 0 - 4 对应 天线 1 - 4
        // 置 1 时为使用该天线

        public byte AntennaFlag = (byte) 0b1111;

        // 数据区

        // 0 -> 写入保留区
        // 1 -> 写入EPC区
        // 2 -> TID区
        // 3 -> 写入用户数据区

        public byte Area = (byte) 0x03;

        // 写地址

        public byte Address_H = (byte) 0x0;

        public byte Address_L = (byte) 0x0;

        // 数据内容

        public byte[] Content = new byte[0];

        // 写入的标签内容需要匹配的参数

        // 0 -> 匹配的数据区 1.EPC 2.TID 3. 用户数据区
        // 1 -> 地址 高8位
        // 2 -> 地址 低8位
        // 3 -> 需要匹配的数据的位长度 即bit长度 Byte是8位的
        // 4 to n -> 需要匹配的数据内容

        public Byte Pid_0x01_0;

        public Byte Pid_0x01_1;

        public Byte Pid_0x01_2;

        public Byte Pid_0x01_3;

        public byte[] Pid_0x01_4_to_n;

        // 标签访问密码

        // 四位 U32

        public Integer Pid_0x02_0;

        public Integer Pid_0x02_1;

        public Integer Pid_0x02_2;

        public Integer Pid_0x02_3;

        // 块写参数

        // 0 -> 采用块写
        // 1 -> 不采用块写

        public Byte Pid_0x03_0;

        public boolean hasParam_0x01() {

            if(Pid_0x01_0 == null) return false;

            if(Pid_0x01_1 == null) return false;

            if(Pid_0x01_2 == null) return false;

            if(Pid_0x01_3 == null) return false;

            if(Pid_0x01_4_to_n == null) return false;

            return true;
        }

        public boolean hasParam_0x02() {

            if(Pid_0x02_0 == null) return false;

            if(Pid_0x02_1 == null) return false;

            if(Pid_0x02_2 == null) return false;

            if(Pid_0x02_3 == null) return false;

            return true;
        }

        public boolean hasParam_0x03() {

            if(Pid_0x03_0 == null) return false;

            return true;
        }
    }
}
